package com.felix.ocoupon.vo;

import com.felix.ocoupon.constant.PeriodType;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.apache.commons.lang3.StringUtils;

/**
 * @author hsufelix
 * @email hsufelix@yeah.net
 * @Date 2020/11/11
 * <h1>模板规则</h1>
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
public class TemplateRule {

    // 优惠券过期规则
    private Expiration expiration;
    // 折扣
    private Discount discount;
    // 每个人最多领几张的限制
    private Integer limitation;
    // 使用范围：地域 + 商品类型
    private Usage usage;
    // 权重(可以和哪些优惠券叠加使用，同一类的优惠券不能叠加使用)
    private String weight;

    public boolean validate() {
        return expiration.validate() && discount.validate()
                && limitation > 0 && usage.validate()
                && StringUtils.isNotEmpty(weight);
    }

    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    public static class Expiration {
        // 有效期规则，对应PeriodType的code字段
        private Integer period;
        // 有效间隔：只对变动性有效期有有效
        private Integer gap;
        // 优惠券模板的失效日期，两类规则都有效
        private Long dealine;

        boolean validate(){
            // 简单校验
            return null != PeriodType.of(period) && gap > 0 && dealine > 0;
        }
    }

    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    public static class Discount {
        // 额度：满减（20），折扣（85），立减
        private Integer quota;
        // 基准，需要满多少才可用
        private Integer base;
        // 优惠券模板的失效日期，两类规则都有效
        private Long dealine;

        boolean validate(){
            // 简单校验
            return quota > 0 && base > 0;
        }
    }

    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    public static class Usage {
        // 省份
        private String province;
        // 基准，需要满多少才可用
        private String city;
        // 城市
        private String area;
        // 商品类型，list【文娱，生鲜，家具，全品类】
        private String goodsType;

        boolean validate(){
            // 简单校验
            return StringUtils.isNoneEmpty(province)
                    && StringUtils.isNoneEmpty(city)
                    && StringUtils.isNoneEmpty(goodsType);
        }
    }


}
